﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;

namespace SecurityApp.Classes
{
    class Stegano
    {

        public static String startEncryptie(String binaireInvoer, String binaireFoto)
        {
            // StringBuilder aanmaken die de nieuwe foto in binair voorstelt
            StringBuilder sb = new StringBuilder(binaireFoto.Length / 8);

            // Data en de header van de foto scheiden (Header is 54bytes groot)
            String head = binaireFoto.Substring(0, 432);
            String data = binaireFoto.Substring(432);

            // De header blijft hetzelfde dus deze wordt alvast toegevoegd
            sb.Append(head);

            // De loop gebeurt van achter naar voor omdat we de data vanachter willen bijvoegen
            // (van nullen achter de data kunnen we moeilijk zeggen of deze er nog bijhoren of niet)
            // (nullen voor de data spelen geen rol en worden genegeerd bij het decrypteren)
            int teller = 0;
            String[] achterNaarVoor = new String[(binaireFoto.Length - 432) / 8];

            // Uitlezen van de foto van achter naar voor
            for (int i = (binaireFoto.Length - 432 - 8) / 8; i >= 0; i--)
            {
                String deel = data.Substring((i * 8), 8);
                String nieuwDeel;
                    
                // Als het aantal loops groter is dan de aantal bits die tegevoegd moeten worden, voegen we voorloop nullen bij
                if (teller >= binaireInvoer.Length)
                {
                    nieuwDeel = deel.Substring(0, 7) + "0";
                }
                else
                {
                    nieuwDeel = deel.Substring(0, 7) + binaireInvoer.Substring(teller, 1);
                }

                teller++;
                achterNaarVoor[i] =  nieuwDeel;
            }

            // De aangepaste waardes staan nog steeds van achter naar voor dus deze volgorde wordt omgedraaid
            foreach (String s in achterNaarVoor)
            {
                sb.Append(s);
            }

            return sb.ToString();
        }

        public static String startDecryptie(String binaireFoto)
        {
            // Header en data gescheiden houden
            String head = binaireFoto.Substring(0, 432);
            String data = binaireFoto.Substring(432);

            // StringBuilder aanmaken
            StringBuilder sb = new StringBuilder(data.Length / 8);

            int lengte = data.Length / 8;
            
            String[] arrayData = new String[lengte];

            // Parallel For loop om elke core te benutten (willekeurig wordt een loop met een bepaalde i waarden uitgevoerd)
            Parallel.For(0, lengte, i =>
            {
                arrayData[i] = data.Substring(i * 8, 8).Substring(7);
            });

            // Rangschikken van de versleutelde gegevens
            for (int i = lengte - 1; i >= 0 ; i--)
            {
                sb.Append(arrayData[i].ToString());
            }

            return sb.ToString();
        }

    }
}
